package com.happy016.aop;

/**
 * 阅读Spring-aop源码,PointCut相关
 *
 * @author Linyb
 * @since 2017/11/8 17:14
 */
public class PointCut_ {

    //PointCut(切点): 决定Advic通知作用于哪个连接点,
    //                  通过PointCut来定义需要增强的方法集合,这些集合的选取可以按照一定的规则来完成

    /*
     *  //一个PointCut由一个ClassFilter和一个MethodMatcher组成.
     *  public interface Pointcut {
     *
     *      //获取 ClassFilter
     *      ClassFilter getClassFilter();
     *
     *      //获取MethodMatcher
     *      MethodMatcher getMethodMatcher();
     *
     *      //默认TRUE
     *      Pointcut TRUE = TruePointcut.INSTANCE;
     *  }
     *
     *  对于切入点的匹配判断由MethodMatcher来完成.
     *  public interface MethodMatcher {
     *
     *      MethodMatcher TRUE = TrueMethodMatcher.INSTANCE;
     *
     *      boolean matches(Method var1, Class<?> var2);
     *
     *      boolean isRuntime();
     *      //匹配规则,为true表示匹配
     *      boolean matches(Method var1, Class<?> var2, Object... var3);
     *   }
     *
     *
     *  以名字匹配PointCut为例:NameMatchMethodPointcut,来看源码,结构如下:
     *
     *  Pointcut                                                        MethodMatcher
     *      |                                                                  |
     *      | <-- StaticMethodMatcherPointcut           StaticMethodMatcher -->|
     *                      | implements                extends|
     *                      | <-- NameMatchMethodPointcut   -->|
     *
     *   定义了匹配规则:方法名相同或者是方法名想匹配的原则
     *   @Override
	 *   public boolean matches(Method method, @Nullable Class<?> targetClass) {
	 *	    for (String mappedName : this.mappedNames) {
	 *		    if (mappedName.equals(method.getName()) || isMatch(method.getName(), mappedName)) {
	 *   			return true;
	 *   		}
	 *  	}
	 *  	return false;
	 *   }
     *
     */
}
